04 函数式编程
函数式编程
只关心定义输入数据和输出数据相关的关系,数学表达式里面其实是在做一种映射(mapping),输入的数据和输出的数据关系是什么样的,是用函数来定义的。
特征
- 函数不维护任何状态
- 输入数据不能动,要返回新的数据集
优势
- 没有状态就没有伤害
- 并行执行无伤害
- Copy-Paste 重构代码无伤害
- 函数的执行没有顺序上的问题
**惰性求值:**表达式不在它被绑定到变量之后就立即求值,而是在该值被取用的时候求值
**确定性:**函数无论在什么场景下,都会得到同样的结果
劣势
- 数据复制比较严重
- 完全纯函数式 Haskell
- 容易写纯函数
- 纯函数需要花更多的精力
函数式编程用到的技术
first class function(头等函数)
函数可以像变量一样被创建、修改,并当成变量一样传递、返回,或是在函数中嵌套函数。
tail recursion optimization(尾递归优化)
使用尾递归优化技术——每次递归时都会重用 stack,这样能够提升性能,需要语言或编译器的支持。
map & reduce
pipeline(管道)
将函数实例成一个一个的 action,然后将一组 action 放到一个数组或是列表中,再把数据传给这个 action list,数据就像一个 pipeline 一样顺序地被各个函数所操作,最终得到想要的结果。
recursing(递归)
简化代码
currying(柯里化)
将一个函数的多个参数分解成多个函数, 然后将函数多层封装起来,每层函数都返回一个函数去接收下一个参数,可以简化函数的多个参数。
higher order function(高阶函数)
函数当参数,把传入的函数做一个封装,然后返回这个封装函数。
函数式编程的思维方式
把程序的逻辑分成了函数,函数都是函数式的,
特点:
- 函数之间没有共享的变量;
- 函数间通过参数和返回值来传递数据;
- 在函数里没有临时变量。
函数式语言的三套件
Map、Reduce 和 Filter